package org.convallaria.framework.common.constants.sys;

import java.time.LocalDateTime;

/**
 * 系统租户相关常量
 * 
 * 功能特性：
 * - 定义租户状态常量
 * - 定义租户字段长度限制
 * - 提供统一的常量管理
 * 
 * 设计原则：
 * - 所有常量都是public static final
 * - 使用final类防止继承
 * - 私有构造函数防止实例化
 * - 按功能模块分组组织
 * 
 * @author convallaria
 * @since 1.0.0
 */
public final class TenantConstants {

    private TenantConstants() {
        // 防止实例化
    }

    // ==================== 租户状态常量 ====================

    /**
     * 租户正常状态
     */
    public static final String TENANT_STATUS_NORMAL = "0";

    /**
     * 租户停用状态
     */
    public static final String TENANT_STATUS_DISABLED = "1";

    // ==================== 租户字段长度限制 ====================

    /**
     * 租户名称最大长度
     */
    public static final int TENANT_NAME_MAX_LENGTH = 100;

    /**
     * 联系人最大长度
     */
    public static final int CONTACT_USER_NAME_MAX_LENGTH = 50;

    /**
     * 联系电话最大长度
     */
    public static final int CONTACT_PHONE_MAX_LENGTH = 20;

    /**
     * 联系邮箱最大长度
     */
    public static final int CONTACT_EMAIL_MAX_LENGTH = 100;

    /**
     * 域名最大长度
     */
    public static final int DOMAIN_MAX_LENGTH = 200;

    /**
     * 备注最大长度
     */
    public static final int REMARK_MAX_LENGTH = 500;

    // ==================== 租户状态描述 ====================

    /**
     * 租户状态描述映射
     */
    public static final String[] TENANT_STATUS_DESCRIPTIONS = {
        "正常", "停用"
    };

    // ==================== 默认值常量 ====================

    /**
     * 默认租户状态
     */
    public static final String DEFAULT_TENANT_STATUS = TENANT_STATUS_NORMAL;

    /**
     * 默认租户ID（系统租户）
     */
    public static final Long DEFAULT_TENANT_ID = 1L;

    /**
     * 默认租户名称
     */
    public static final String DEFAULT_TENANT_NAME = "系统租户";

    // ==================== 业务规则常量 ====================

    /**
     * 租户名称正则表达式（中文、字母、数字、下划线、连字符、空格、括号）
     */
    public static final String TENANT_NAME_PATTERN = "^[\\u4e00-\\u9fa5a-zA-Z0-9_\\-\\s()（）]+$";

    /**
     * 联系人正则表达式（中文、字母、数字、下划线、连字符、空格、点号）
     */
    public static final String CONTACT_USER_NAME_PATTERN = "^[\\u4e00-\\u9fa5a-zA-Z0-9_\\-\\s.]+$";

    /**
     * 联系电话正则表达式（数字、连字符、括号、空格）
     */
    public static final String CONTACT_PHONE_PATTERN = "^[0-9\\-()\\s]+$";

    /**
     * 邮箱正则表达式
     */
    public static final String CONTACT_EMAIL_PATTERN = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";

    /**
     * 域名正则表达式（字母、数字、连字符、点号）
     */
    public static final String DOMAIN_PATTERN = "^[a-zA-Z0-9.-]+$";

    /**
     * 租户过期时间默认值（1年后）
     */
    public static final LocalDateTime DEFAULT_EXPIRE_TIME = LocalDateTime.now().plusYears(1);

    // ==================== 工具方法 ====================

    /**
     * 获取租户状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getTenantStatusDesc(String status) {
        if (TENANT_STATUS_NORMAL.equals(status)) {
            return TENANT_STATUS_DESCRIPTIONS[0];
        } else if (TENANT_STATUS_DISABLED.equals(status)) {
            return TENANT_STATUS_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 验证租户状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidTenantStatus(String status) {
        return TENANT_STATUS_NORMAL.equals(status) || TENANT_STATUS_DISABLED.equals(status);
    }

    /**
     * 验证租户名称是否有效
     * 
     * @param tenantName 租户名称
     * @return true=有效，false=无效
     */
    public static boolean isValidTenantName(String tenantName) {
        if (tenantName == null || tenantName.trim().isEmpty()) {
            return false;
        }
        if (tenantName.length() > TENANT_NAME_MAX_LENGTH) {
            return false;
        }
        return tenantName.matches(TENANT_NAME_PATTERN);
    }

    /**
     * 验证联系人是否有效
     * 
     * @param contactUserName 联系人
     * @return true=有效，false=无效
     */
    public static boolean isValidContactUserName(String contactUserName) {
        if (contactUserName == null || contactUserName.trim().isEmpty()) {
            return true; // 联系人可以为空
        }
        if (contactUserName.length() > CONTACT_USER_NAME_MAX_LENGTH) {
            return false;
        }
        return contactUserName.matches(CONTACT_USER_NAME_PATTERN);
    }

    /**
     * 验证联系电话是否有效
     * 
     * @param contactPhone 联系电话
     * @return true=有效，false=无效
     */
    public static boolean isValidContactPhone(String contactPhone) {
        if (contactPhone == null || contactPhone.trim().isEmpty()) {
            return true; // 联系电话可以为空
        }
        if (contactPhone.length() > CONTACT_PHONE_MAX_LENGTH) {
            return false;
        }
        return contactPhone.matches(CONTACT_PHONE_PATTERN);
    }

    /**
     * 验证联系邮箱是否有效
     * 
     * @param contactEmail 联系邮箱
     * @return true=有效，false=无效
     */
    public static boolean isValidContactEmail(String contactEmail) {
        if (contactEmail == null || contactEmail.trim().isEmpty()) {
            return true; // 联系邮箱可以为空
        }
        if (contactEmail.length() > CONTACT_EMAIL_MAX_LENGTH) {
            return false;
        }
        return contactEmail.matches(CONTACT_EMAIL_PATTERN);
    }

    /**
     * 验证域名是否有效
     * 
     * @param domain 域名
     * @return true=有效，false=无效
     */
    public static boolean isValidDomain(String domain) {
        if (domain == null || domain.trim().isEmpty()) {
            return true; // 域名可以为空
        }
        if (domain.length() > DOMAIN_MAX_LENGTH) {
            return false;
        }
        return domain.matches(DOMAIN_PATTERN);
    }

    /**
     * 验证租户信息是否完整
     * 
     * @param tenantName 租户名称
     * @param status 状态
     * @return true=完整，false=不完整
     */
    public static boolean isValidTenantInfo(String tenantName, String status) {
        return isValidTenantName(tenantName) && isValidTenantStatus(status);
    }

    /**
     * 判断租户是否过期
     * 
     * @param expireTime 过期时间
     * @return true=已过期，false=未过期
     */
    public static boolean isTenantExpired(LocalDateTime expireTime) {
        if (expireTime == null) {
            return false; // 没有过期时间表示永不过期
        }
        return LocalDateTime.now().isAfter(expireTime);
    }

    /**
     * 判断租户是否即将过期（30天内）
     * 
     * @param expireTime 过期时间
     * @return true=即将过期，false=未即将过期
     */
    public static boolean isTenantExpiringSoon(LocalDateTime expireTime) {
        if (expireTime == null) {
            return false; // 没有过期时间表示永不过期
        }
        LocalDateTime warningTime = LocalDateTime.now().plusDays(30);
        return expireTime.isBefore(warningTime) && !isTenantExpired(expireTime);
    }

    /**
     * 清理租户名称（去除多余空格）
     * 
     * @param tenantName 原始租户名称
     * @return 清理后的租户名称
     */
    public static String cleanTenantName(String tenantName) {
        if (tenantName == null) {
            return "";
        }
        return tenantName.trim().replaceAll("\\s+", " ");
    }

    /**
     * 清理联系人（去除多余空格）
     * 
     * @param contactUserName 原始联系人
     * @return 清理后的联系人
     */
    public static String cleanContactUserName(String contactUserName) {
        if (contactUserName == null) {
            return "";
        }
        return contactUserName.trim().replaceAll("\\s+", " ");
    }

    /**
     * 清理联系电话（去除多余空格和特殊字符）
     * 
     * @param contactPhone 原始联系电话
     * @return 清理后的联系电话
     */
    public static String cleanContactPhone(String contactPhone) {
        if (contactPhone == null) {
            return "";
        }
        return contactPhone.trim().replaceAll("[^0-9\\-()\\s]", "");
    }

    /**
     * 清理域名（转换为小写）
     * 
     * @param domain 原始域名
     * @return 清理后的域名
     */
    public static String cleanDomain(String domain) {
        if (domain == null) {
            return "";
        }
        return domain.trim().toLowerCase();
    }
}
